package com.yumeng.framework.runtime;

import com.yumeng.common.data.enums.ZoneId;
import com.yumeng.common.exception.YumengException;
import com.yumeng.common.runtime.GlobalVariableHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

import java.util.TimeZone;

/**
 * 在上下文刷新之前对其进行自定义初始化
 * 可以实现动态配置、环境隔离、自定义 Bean 注册等功能
 * @author wxd
 * @date 2025/11/6 11:11
 */
@Slf4j
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        log.info("====================MyApplicationContextInitializer开始执行");
        initTimeZone(applicationContext.getEnvironment());

        log.info("====================MyApplicationContextInitializer执行结束");
    }

    /**
     * 时区初始化
     * 目前仅支持Asia/Shanghai区
     */
    private void initTimeZone(ConfigurableEnvironment environment){
        log.info("时区初始化......");
        //指定的时区
        ZoneId cfgZoneId = environment.getProperty("yumeng.default-time-zone", ZoneId.class);

        String tgtZoneId = null;//目标时区id
        if (cfgZoneId != null){
            tgtZoneId = cfgZoneId.getZoneId();
            log.info("外部指定时区：{}", tgtZoneId);
            TimeZone.setDefault(TimeZone.getTimeZone(tgtZoneId));
        }else{
            tgtZoneId = ZoneId.CTT.getZoneId();
            log.info("使用系统当前时区");
        }
        TimeZone defTZ = TimeZone.getDefault();
        log.info("时区初始化完成：{}", defTZ);
        if (!defTZ.getID().equals(tgtZoneId)){
            throw new YumengException("时区初始化异常：实际[%s]-目标[%s]", defTZ.getID(), tgtZoneId);
        }
        GlobalVariableHelper.getInstance().registerTimeZone(defTZ.getID());
    }
}
